#include <sys/mman.h>
#include <sys/stat.h>
#include <string>
#include <sys/types.h>
#include <fcntl.h>
#include <cstdlib>
#include <vector>
#include <utility>
#include <unistd.h>
#include <cmath>
#include <errno.h>
#include <cstring>

// 包装mmap，使其可以达到C++STL中string的便携

typedef long long ll;

#define END 1000000007

class fileMmap
{
public:
    
    fileMmap(const std::string path, mode_t mode);

    ll size(); 

    bool write(const std::string& writeContent);

    std::string read(size_t start = 0, size_t end = END);

    bool clear();   //清空文件内容， 容量不变
    
    ~fileMmap(); //容量适应内容


private:
    bool expansion(ll size); //扩容到能包括内容的标准块大小

    ll dichotomy(ll target); // 二分查询块位置

    std::vector<std::pair<char*, off_t>> _file;     //块起始地址、块大小 
    std::vector<ll> _offset;    //每个块的起始偏移量
    ll _size;   //文件内容大小（字节）
    ll _capacity;   //文件容量
    ll _fd;    //文件标识符
    struct stat _attribute; // 文件属性
};